package com.ufcg.lvc.client.prototipacao;

import java.util.ArrayList;
import java.util.List;

import org.apache.tools.ant.types.CommandlineJava.SysProperties;

import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.AbsolutePanel;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.TextArea;
import com.google.gwt.user.client.ui.TextBox;
import com.smartgwt.client.widgets.grid.ListGridRecord;
import com.ufcg.lvc.client.GreetingServiceCRUD;
import com.ufcg.lvc.client.GreetingServiceCRUDAsync;
import com.ufcg.lvc.client.UserData;
import com.ufcg.lvc.client.MyListGrids.QuestoesDoModeloListGrid;
import com.ufcg.lvc.client.Records.QuestoesDoModeloRecord;

public class NovoModeloDeProva {

	private AbsolutePanel painelNovoModeloDeProva;
	private TextBox tituloTB, assuntoTB;
	private TextArea comentarioTA;
	private String tituloAntigo;
	private QuestoesDoModeloListGrid listGrid ;
	private Boolean editar = false;
	private String modelo_id = "";
	private ArrayList<String> listaQuestoes0, listaQuestoes1, listaQuestoes2, listaQuestoes3, listaQuestoes4, listaQuestoes5, titulosModelo;
	private ArrayList<QuestoesDoModeloRecord> records = new ArrayList<QuestoesDoModeloRecord>();
	private Button btnCancelar, btnAddQuestoes, btnSalvar, btnRemover;
	private Label lblquestoes, lblEnunciado, lblAssuntoAbordado, lblTituloQuestao, lblTitulo;
	UserData UD;
	public NovoModeloDeProva(UserData uD) {
		UD = uD;
		AsyncCallback<String> callback = new AsyncCallback<String>() {
			
			@Override
			public void onSuccess(String result) {
				modelo_id = result;
				Draw();
			}
			
			@Override
			public void onFailure(Throwable caught) {
				System.out.println("Erro na comunicação com o servidor");
			}
		};
		
		init();
		getServicoCRUD().getNextIDModelo(callback);
	}

	/** Editar modelo */
	public NovoModeloDeProva(String titulo, String assunto, String comentario,UserData uD) {
		UD = uD;
		editar = true;
		
		AsyncCallback<String> callbackSTR = new AsyncCallback<String>() {
			@Override
			public void onSuccess(String result) {
				modelo_id = result;
				Draw();
			}
			
			@Override
			public void onFailure(Throwable caught) {
				System.out.println("Erro na comunicação com o servidor");
			}
		};
		
		init();
		getServicoCRUD().getIDModelo(titulo, UD.getId_usuario(),callbackSTR );
		atualizarCampos(titulo, assunto, comentario);
	}
	
	/** Editar modelo */
	public NovoModeloDeProva(String modelo_id, UserData uD) {
		UD = uD;
		
		AsyncCallback<List<String>> callback1 = new AsyncCallback<List<String>>() {
			
			@Override
			public void onSuccess(List<String> result) {
				System.out.println("atualizarCampos " +result.get(0) +" "+ result.get(1) +" "+ result.get(2));
				atualizarCampos(result.get(0), result.get(1), result.get(2));
				Draw();
			}
			
			@Override
			public void onFailure(Throwable caught) {
				System.out.println("Erro na comunicação com o servidor");			
			}
		};
		
		this.modelo_id = modelo_id;
		System.out.println("id recebido " + modelo_id);
		System.out.println("id local " + this.modelo_id);
		init();
		getServicoCRUD().getModeloDeProva(modelo_id, callback1);	
	}

	// Atualizar campos - inicio
	private void atualizarCampos(String titulo, String assunto,	String comentario) {

		lblTitulo.setText("Editar modelo de prova");
		tituloAntigo = titulo;
		tituloTB.setText(titulo);
		assuntoTB.setText(assunto);
		comentarioTA.setText(comentario);		

	}// Atualizar campos - fim


	public static GreetingServiceCRUDAsync getServicoCRUD() {
		return GWT.create(GreetingServiceCRUD.class);
	}

	public void Draw() {
		getServicoCRUD().getQuestoesDoModeloDeProva(modelo_id, new AsyncCallback< List<List<String>> >() {
		
			@Override
			public void onSuccess(List<List<String>> result) {
				listaQuestoes0 = (ArrayList<String>) result.get(0);
				listaQuestoes1 = (ArrayList<String>) result.get(1);
				listaQuestoes2 = (ArrayList<String>) result.get(2);
				listaQuestoes3 = (ArrayList<String>) result.get(3);
				listaQuestoes4 = (ArrayList<String>) result.get(4);
				listaQuestoes5 = (ArrayList<String>) result.get(5);
	
				for (int i = 0; i < listaQuestoes0.size(); i++) {
					records.add(new QuestoesDoModeloRecord(listaQuestoes0.get(i), listaQuestoes1.get(i), listaQuestoes2.get(i), listaQuestoes3.get(i), listaQuestoes4.get(i), listaQuestoes5.get(i)));
				}
				for (int i = 0; i < records.size(); i++) {
					listGrid.addData(records.get(i));
				}
			}
			
			@Override
			public void onFailure(Throwable caught) {
				System.out.println("Erro na comunicação com o servidor");
			}
		});
		
		getServicoCRUD().getModelosDeProva(UD.getId_usuario(), new AsyncCallback<List<List<String>>>() {
			
			@Override
			public void onSuccess(List<List<String>> result) {
				titulosModelo = (ArrayList<String>) result.get(0);
				titulosModelo.remove(tituloAntigo);
			}
			
			@Override
			public void onFailure(Throwable caught) {
				titulosModelo = new ArrayList<String>();
			}
		});
		
		
		final AsyncCallback<Boolean> callback = new AsyncCallback<Boolean>() {

			@Override
			public void onSuccess(Boolean result) {
			}
			
			@Override
			public void onFailure(Throwable caught) {
				System.out.println("Erro na comunicação com o servidor");
			}
			
		};

		painelNovoModeloDeProva.setSize("900px", "707px");
				
		lblTitulo.setStyleName("gwt-TituloMedio");
		painelNovoModeloDeProva.add(lblTitulo, 0, 10);

		painelNovoModeloDeProva.add(lblTituloQuestao, 60, 69);
		lblTituloQuestao.setSize("43px", "17px");

		painelNovoModeloDeProva.add(lblAssuntoAbordado, 60, 109);
		lblAssuntoAbordado.setSize("165px", "17px");

		lblEnunciado.setDirectionEstimator(true);
		painelNovoModeloDeProva.add(lblEnunciado, 60, 154);
		lblEnunciado.setSize("75px", "17px");

		painelNovoModeloDeProva.add(tituloTB, 235, 69);
		tituloTB.setSize("422px", "14px");

		painelNovoModeloDeProva.add(assuntoTB, 235, 109);
		assuntoTB.setSize("422px", "14px");

		comentarioTA.setSize("587px", "153px");
		painelNovoModeloDeProva.add(comentarioTA, 235, 154);
		
		painelNovoModeloDeProva.add(lblquestoes, 60, 337);
		lblquestoes.setSize("90px", "17px");
		
		painelNovoModeloDeProva.add(listGrid, 230, 337);
		listGrid.setSize("602px", "208px");
		
		painelNovoModeloDeProva.add(btnRemover, 751, 551);
		btnRemover.setSize("81px", "30px");
		
		btnAddQuestoes.setText("Adicionar");
		painelNovoModeloDeProva.add(btnAddQuestoes, 664, 551);
		btnAddQuestoes.setSize("81px", "30px");

		btnSalvar.setText("Salvar");
		painelNovoModeloDeProva.add(btnSalvar, 369, 629);
		btnSalvar.setSize("81px", "30px");

		painelNovoModeloDeProva.add(btnCancelar, 456, 629);
		btnCancelar.setSize("81px", "30px");
				
		btnSalvar.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {
				if (!tituloTB.getText().equals("") && !assuntoTB.getText().equals("")) {
					if (!titulosModelo.contains(tituloTB.getText())) {
						getServicoCRUD().updateModeDeProva(tituloAntigo, tituloTB.getText(),assuntoTB.getText(), comentarioTA.getText(), callback);
						painelNovoModeloDeProva.clear();
						final MeusModelosDeProva n = new MeusModelosDeProva(UD);
						painelNovoModeloDeProva.add(n.getPanel());		
					} else {
						Window.alert("Titulo não disponível. Já existe um modelo de prova com este título.");	
					}
				} else {
					Window.alert("Os campos Titulo e Assunto devem ser preenchidos.");
				}
			}
		});
				
		btnCancelar.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {
				painelNovoModeloDeProva.clear();
				final MeusModelosDeProva m = new MeusModelosDeProva(UD);
				painelNovoModeloDeProva.add(m.getPanel());
			}
		});

		btnAddQuestoes.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {
				if (!tituloTB.getText().trim().equals("") && !assuntoTB.getText().trim().equals("")) {
					if (!titulosModelo.contains(tituloTB.getText())) {
						getServicoCRUD().salvarModeDeProva(tituloTB.getText(),assuntoTB.getText(), comentarioTA.getText(), modelo_id, UD.getId_usuario(), callback);
						painelNovoModeloDeProva.clear();
						final AdicionarQuestaoDeProva m = new AdicionarQuestaoDeProva(modelo_id, tituloTB.getText(),assuntoTB.getText(), comentarioTA.getText(), UD);
						painelNovoModeloDeProva.add(m.getPanel());
					} else {
						Window.alert("Titulo não disponível. Já existe um modelo de prova com este título.");	
					}
				} else {
					Window.alert("Os campos Titulo e Assunto devem ser preenchidos.");
				}			
			}
		});

		btnRemover.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {
				ListGridRecord elem = listGrid.getSelectedRecord();
				listGrid.removeData(listGrid.getSelectedRecord());
				System.out.println(modelo_id);
				System.out.println(elem.getAttribute("titulo"));
				System.out.println(elem.getAttribute("valor"));
				System.out.println(UD.getId_usuario());
				getServicoCRUD().deletarQuestaoDoModeloDeProva(modelo_id, elem.getAttribute("titulo"), elem.getAttribute("valor"), UD.getId_usuario(), callback);
				System.out.println("linha deletada");
			}
		});

	}

	public AbsolutePanel getPanel() {
		return painelNovoModeloDeProva;
	}

	public void deleteRecord(QuestoesDoModeloRecord record) {
		try {
			records.remove(record);	
		} catch (Exception e) {
		}
	}

	public void addRecord(QuestoesDoModeloRecord record) {
		this.records.add(record);
	}
	
	private void init(){
		painelNovoModeloDeProva = new AbsolutePanel();	
		lblTitulo = new Label("Novo modelo de prova");
		lblTituloQuestao = new Label("Título:");
		lblAssuntoAbordado = new Label("Assunto abordado:");
		lblEnunciado = new Label("Comentário:");
		tituloTB = new TextBox();
		assuntoTB = new TextBox();
		comentarioTA = new TextArea();
		lblquestoes = new Label("Questões:");
		listGrid = new QuestoesDoModeloListGrid(getServicoCRUD(), UD);
		
		btnRemover = new Button("Remover");
		btnAddQuestoes = new Button("Criar");
		btnSalvar = new Button("Criar");
		btnCancelar = new Button("Cancelar");
	}
}
